{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#!/usr/bin/env python3\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import ms_entropy\n",
    "from sklearn import metrics\n",
    "import matplotlib.pyplot as plt\n",
    "from ms_entropy import clean_spectrum\n",
    "from ms_entropy.file_io.msp_file import read_one_spectrum\n",
    "\n",
    "MS1_TOLERANCE_IN_PPM = 10\n",
    "\n",
    "\n",
    "def load_spectra_from_msp(file_msp):\n",
    "    # Split spectra by ion mode.\n",
    "    all_raw_spectra = {\"[M+H]+\": [], \"[M-H]-\": []}\n",
    "\n",
    "    for spec in read_one_spectrum(file_msp):\n",
    "        precursor_type = spec.get(\"precursor_type\", \"\")\n",
    "        if precursor_type == \"[M+H]+\":\n",
    "            ion_mode = \"[M+H]+\"\n",
    "        elif precursor_type == \"[M-H]-\":\n",
    "            ion_mode = \"[M-H]-\"\n",
    "        else:\n",
    "            continue\n",
    "\n",
    "        try:\n",
    "            spec[\"precursor_mz\"] = float(spec.pop(\"precursormz\"))\n",
    "        except Exception as e:\n",
    "            print(f\"Error: {e}\")\n",
    "            continue\n",
    "\n",
    "        spec[\"inchikey\"] = spec.get(\"inchikey\", \"\").split(\"-\")[0]\n",
    "        spec[\"id\"] = int(spec[\"id\"])\n",
    "\n",
    "        # Clean and centroid the spectrum.\n",
    "        spec[\"peaks\"] = clean_spectrum(peaks=spec[\"peaks\"], noise_threshold=0.01, max_mz=spec[\"precursor_mz\"] - 1.6, min_ms2_difference_in_da=0.05)\n",
    "        if len(spec[\"peaks\"]) > 0 and spec[\"inchikey\"]:\n",
    "            all_raw_spectra[ion_mode].append(\n",
    "                {\n",
    "                    \"id\": spec[\"id\"],\n",
    "                    \"inchikey\": spec[\"inchikey\"],\n",
    "                    \"precursor_mz\": spec[\"precursor_mz\"],\n",
    "                    \"peaks\": np.array(spec[\"peaks\"]),\n",
    "                }\n",
    "            )\n",
    "\n",
    "    return all_raw_spectra\n",
    "\n",
    "\n",
    "def search_spectra_against_library(all_raw_spectra):\n",
    "    # Sort the spectra by precursor m/z.\n",
    "    all_raw_spectra = sorted(all_raw_spectra, key=lambda x: x[\"precursor_mz\"])\n",
    "    all_results = []\n",
    "\n",
    "    precursor_mz_array = np.array([spec[\"precursor_mz\"] for spec in all_raw_spectra], dtype=np.float32)\n",
    "    for idx, spec in enumerate(all_raw_spectra):\n",
    "        precursor_mz = spec[\"precursor_mz\"]\n",
    "        peaks = spec[\"peaks\"]\n",
    "        inchikey = spec[\"inchikey\"]\n",
    "        spec_id = spec[\"id\"]\n",
    "\n",
    "        precursor_mz_left = precursor_mz * (1 - MS1_TOLERANCE_IN_PPM / 1e6)\n",
    "        precursor_mz_right = precursor_mz * (1 + MS1_TOLERANCE_IN_PPM / 1e6)\n",
    "\n",
    "        candidate_idx = np.searchsorted(precursor_mz_array, precursor_mz_left, side=\"left\")\n",
    "        candidate_idx_right = np.searchsorted(precursor_mz_array, precursor_mz_right, side=\"right\")\n",
    "\n",
    "        # Search the candidate spectra.\n",
    "        for candidate_idx in range(candidate_idx, candidate_idx_right):\n",
    "            if candidate_idx == idx:\n",
    "                continue\n",
    "            candidate_spec = all_raw_spectra[candidate_idx]\n",
    "            candidate_peaks = candidate_spec[\"peaks\"]\n",
    "\n",
    "            entropy_similarity = ms_entropy.calculate_entropy_similarity(peaks, candidate_peaks, ms2_tolerance_in_da=0.05)\n",
    "            all_results.append([spec_id, inchikey, candidate_spec[\"id\"], candidate_spec[\"inchikey\"], entropy_similarity])\n",
    "\n",
    "    df = pd.DataFrame(all_results, columns=[\"spec_id_query\", \"inchikey_query\", \"spec_id_library\", \"inchikey_library\", \"score_entropy\"])\n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>spec_id_query</th>\n",
       "      <th>inchikey_query</th>\n",
       "      <th>spec_id_library</th>\n",
       "      <th>inchikey_library</th>\n",
       "      <th>score_entropy</th>\n",
       "      <th>ion_type</th>\n",
       "      <th>correct</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10853</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>10854</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>0.857456</td>\n",
       "      <td>[M+H]+</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10853</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>10855</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>0.857456</td>\n",
       "      <td>[M+H]+</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10853</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>10856</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>0.857456</td>\n",
       "      <td>[M+H]+</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10853</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>10857</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>0.857456</td>\n",
       "      <td>[M+H]+</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10853</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>10858</td>\n",
       "      <td>ZRALSGWEFCBTJO</td>\n",
       "      <td>0.754743</td>\n",
       "      <td>[M+H]+</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   spec_id_query  inchikey_query  spec_id_library inchikey_library  \\\n",
       "0          10853  ZRALSGWEFCBTJO            10854   ZRALSGWEFCBTJO   \n",
       "1          10853  ZRALSGWEFCBTJO            10855   ZRALSGWEFCBTJO   \n",
       "2          10853  ZRALSGWEFCBTJO            10856   ZRALSGWEFCBTJO   \n",
       "3          10853  ZRALSGWEFCBTJO            10857   ZRALSGWEFCBTJO   \n",
       "4          10853  ZRALSGWEFCBTJO            10858   ZRALSGWEFCBTJO   \n",
       "\n",
       "   score_entropy ion_type  correct  \n",
       "0       0.857456   [M+H]+     True  \n",
       "1       0.857456   [M+H]+     True  \n",
       "2       0.857456   [M+H]+     True  \n",
       "3       0.857456   [M+H]+     True  \n",
       "4       0.754743   [M+H]+     True  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Load the spectra from the MSP file.\n",
    "FILE_MSP = r\"nist20.msp\"\n",
    "all_raw_spectra = load_spectra_from_msp(FILE_MSP)\n",
    "\n",
    "# Search the spectra against the library.\n",
    "all_result = []\n",
    "for ion_mode in all_raw_spectra:\n",
    "    df_result = search_spectra_against_library(all_raw_spectra[ion_mode])\n",
    "    df_result[\"ion_type\"] = ion_mode\n",
    "    all_result.append(df_result)\n",
    "\n",
    "# Combine the results.\n",
    "df = pd.concat(all_result)\n",
    "df[\"correct\"] = df[\"inchikey_query\"] == df[\"inchikey_library\"]\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>spec_id_query</th>\n",
       "      <th>inchikey_library</th>\n",
       "      <th>inchikey_query</th>\n",
       "      <th>spec_id_library</th>\n",
       "      <th>score_entropy</th>\n",
       "      <th>ion_type</th>\n",
       "      <th>correct</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>16</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>18</td>\n",
       "      <td>0.891671</td>\n",
       "      <td>[M-H]-</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>17</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>20</td>\n",
       "      <td>0.907855</td>\n",
       "      <td>[M-H]-</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>18</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>17</td>\n",
       "      <td>0.895407</td>\n",
       "      <td>[M-H]-</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>19</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>20</td>\n",
       "      <td>0.928502</td>\n",
       "      <td>[M-H]-</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>LSHJMDWWJIYXEM</td>\n",
       "      <td>19</td>\n",
       "      <td>0.928502</td>\n",
       "      <td>[M-H]-</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   spec_id_query inchikey_library  inchikey_query  spec_id_library  \\\n",
       "0             16   LSHJMDWWJIYXEM  LSHJMDWWJIYXEM               18   \n",
       "1             17   LSHJMDWWJIYXEM  LSHJMDWWJIYXEM               20   \n",
       "2             18   LSHJMDWWJIYXEM  LSHJMDWWJIYXEM               17   \n",
       "3             19   LSHJMDWWJIYXEM  LSHJMDWWJIYXEM               20   \n",
       "4             20   LSHJMDWWJIYXEM  LSHJMDWWJIYXEM               19   \n",
       "\n",
       "   score_entropy ion_type  correct  \n",
       "0       0.891671   [M-H]-     True  \n",
       "1       0.907855   [M-H]-     True  \n",
       "2       0.895407   [M-H]-     True  \n",
       "3       0.928502   [M-H]-     True  \n",
       "4       0.928502   [M-H]-     True  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# For each spec_id_query, leave only the row with the highest score_entropy\n",
    "\n",
    "# Sort by score_entropy\n",
    "df = df.sort_values(by=\"score_entropy\", ascending=False)\n",
    "# Group by spec_id_query, inchikey_library\n",
    "df_grouped = df.groupby([\"spec_id_query\", \"inchikey_library\"])\n",
    "# Leave only the row with the highest score_entropy\n",
    "df_top_1 = df_grouped.first().reset_index()\n",
    "\n",
    "df_top_1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ROC AUC: 0.9582105339342506\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot ROC curve\n",
    "fpr, tpr, thresholds = metrics.roc_curve(df_top_1[\"correct\"], df_top_1[\"score_entropy\"])\n",
    "roc_auc = metrics.auc(fpr, tpr)\n",
    "print(f\"ROC AUC: {roc_auc}\")\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(fpr, tpr, color=\"darkorange\", lw=2, label=f\"ROC curve (area = {roc_auc:.3f})\")\n",
    "plt.plot([0, 1], [0, 1], color=\"navy\", lw=2, linestyle=\"--\")\n",
    "plt.xlim([0.0, 1.0])\n",
    "plt.ylim([0.0, 1.0])\n",
    "plt.xlabel(\"False Positive Rate\")\n",
    "plt.ylabel(\"True Positive Rate\")\n",
    "plt.title(\"Receiver Operating Characteristic\")\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py37",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
